class Solution {
public:
    long long maximumTotalDamage(vector<int>& power) {
        unordered_map<int,int>mp;
        for(int i=0;i<power.size();i++)
        mp[power[i]]++;

        vector<pair<int,int>>arr(mp.begin(),mp.end());
        ranges::sort(arr);

        int n=arr.size();
        vector<long long>dp(n+1);  //dp[0]=0,防止下面dp[i-1]当i=0时越界
        for(int i=0,j=0;i<n;i++)
        {
            auto& [x,c]=arr[i];
            while(arr[j].first<x-2)//防止j越界,找到dp[i-3]的位置
            j++; 
            dp[i+1]=max(dp[i],dp[j]+(long long)c*x);
            //dp[i]=max(dp[i-1],dp[i-3]+对应位置的值*出现次数)
        }
        return dp[n];
    }
};